x86_emulate: Certain opcodes are only valid with a memory operand.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 10 Jan 2008 22:52:40 +0000 (22:52 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 10 Jan 2008 22:52:40 +0000 (22:52 +0000)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/x86_emulate.c

index 679754c7a89900d471482f88833069ba78e104f3..a31b5370eb667e54d0113f4ed6188f22808e4002 100644 (file)
@@ -1751,6 +1751,8 @@ x86_emulate(
         case 5: /* jmp (far, absolute indirect) */ {
             unsigned long sel;
 
+            generate_exception_if(dst.type != OP_MEM, EXC_UD);
+
             if ( (rc = ops->read(dst.mem.seg, dst.mem.off+dst.bytes,
                                  &sel, 2, ctxt)) )
                 goto done;
@@ -2981,6 +2983,7 @@ x86_emulate(
     {
         unsigned long old_lo, old_hi;
         generate_exception_if((modrm_reg & 7) != 1, EXC_UD);
+        generate_exception_if(ea.type != OP_MEM, EXC_UD);
         if ( (rc = ops->read(ea.mem.seg, ea.mem.off+0, &old_lo, 4, ctxt)) ||
              (rc = ops->read(ea.mem.seg, ea.mem.off+4, &old_hi, 4, ctxt)) )
             goto done;
@@ -3008,6 +3011,7 @@ x86_emulate(
     {
         unsigned long old, new;
         generate_exception_if((modrm_reg & 7) != 1, EXC_UD);
+        generate_exception_if(ea.type != OP_MEM, EXC_UD);
         if ( (rc = ops->read(ea.mem.seg, ea.mem.off, &old, 8, ctxt)) != 0 )
             goto done;
         if ( ((uint32_t)(old>>0) != (uint32_t)_regs.eax) ||